package KnowSparkSQL.SQL.UDf;

import org.apache.spark.sql.AnalysisException;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.api.java.UDF1;
import org.apache.spark.sql.types.DataTypes;


/**
 * 当Spark SQL内置的某些函数无法满足我们的需求时，
 * 就可以进行自定义函数，定义好后，可以像内置函数那样直接调用。
 * 自定义函数 UDF
 * 自定义一个adult(Long age)函数，
 * 输入是一个年龄值，
 * 返回值是“成年”或者“未成年”。
 * 演示代码如下（注意看代码注释）：
 */
public class CustomFunction {
    public static void main(String[] args) throws AnalysisException {
        SparkSession sparkSession = SparkSession.builder().appName(demo.class.getName()).master("local").getOrCreate();

        Dataset<Row> json = sparkSession.read().json("./data/student.json");

        json.createTempView("student");

        sparkSession.udf().register("adult", new UDF1<Long, String>() {
            @Override
            public String call(Long integer) throws Exception {
                return integer >= 18 ? "成年" : "未成年";
            }
        }, DataTypes.StringType);

        sparkSession.sql("select name, adult(age) as `是否成年` from student").show();
    }
}
